package com.redstar.interesting.common.starter.redis;

import java.util.concurrent.TimeUnit;

/**
 * @ClassName RedisLock
 * @Author cwx
 * @Date 2021/11/25 17:11
 **/
public interface RedisLock {

    /**
     * 获取锁 如果锁可用，立即返回true，否则立即返回false，作为非阻塞式锁使用
     */
    boolean tryLock(String key, String value);

    /**
     * 锁在给定的等待时间内空闲，则获取锁成功 返回true，否则返回false，作为阻塞式锁使用
     *
     * @param key 锁键
     * @param value 被谁锁定
     * @param timeout 尝试获取锁时长，建议传递500,结合实践单位，则可表示500毫秒
     * @param unit 建议传递TimeUnit.MILLISECONDS
     */
    boolean tryLock(String key, String value, long timeout, TimeUnit unit);

    /**
     * 锁在给定的等待时间内空闲，则获取锁成功 返回true， 否则返回false，作为阻塞式锁使用
     *
     * @param key 锁键
     * @param value 被谁锁定
     * @param timeout 尝试获取锁时长，建议传递500,结合实践单位，则可表示500毫秒
     * @param unit 建议传递TimeUnit.MILLISECONDS
     * @param expire 锁的过期时间单位:秒
     */
    boolean tryLock(String key, String value, long timeout, TimeUnit unit, long expire);

    /**
     * 释放单个锁,只能由持有锁的线程释放锁
     *
     * @param key 锁键
     */
    void unLock(String key, String value);

    /**
     * 获得Redis锁的key
     *
     * @param key - 要锁的key
     * @return key
     */
    String getLockKey(String key);

}
